/*
 * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.io;

/**
 * 用于读取过滤字符流的抽象类。抽象类 <code>FilterReader</code> 本身
 * 提供了将所有请求传递给包含的流的默认方法。
 * 其子类应覆盖这些方法中的一些方法，并且还可以提供额外的方法和字段。
 *
 * @author  Mark Reinhold
 * @since   JDK1.1
 */
public abstract class FilterReader extends Reader {

    /**
     * 基础字符输入流。
     */
    protected Reader in;

    /**
     * 创建一个新的过滤读取器。
     *
     * @param in  基础字符输入流。
     */
    protected FilterReader(Reader in) {
        super(in);
        this.in = in;
    }

    /**
     * 读取单个字符。
     *
     * @return  读取的字符，如果已到达流的末尾，则为 -1。
     *
     * @throws  IOException  如果发生 I/O 错误。
     */
    public int read() throws IOException {
        return in.read();
    }

    /**
     * 将字符读入数组的一部分。
     *
     * @param      cbuf  目标缓冲区
     * @param      off   开始存储字符的偏移量
     * @param      len   要读取的最大字符数
     *
     * @return     读取的字符数，如果已到达流的末尾，则为 -1
     *
     * @throws  IOException  如果发生 I/O 错误。
     */
    public int read(char cbuf[], int off, int len) throws IOException {
        return in.read(cbuf, off, len);
    }

    /**
     * 跳过字符。
     *
     * @param  n  要跳过的字符数
     *
     * @return    实际跳过的字符数
     *
     * @throws  IOException  如果发生 I/O 错误。
     */
    public long skip(long n) throws IOException {
        return in.skip(n);
    }

    /**
     * 告知此流是否已准备好读取。
     *
     * @return  如果保证下一个 read() 不会阻塞输入，则为 true，
     *          否则为 false。请注意，返回 false 并不保证下一次读取会被阻塞。
     *
     * @throws  IOException  如果发生 I/O 错误。
     */
    public boolean ready() throws IOException {
        return in.ready();
    }

    /**
     * 告知此流是否支持 mark() 操作。
     *
     * @return  如果此流支持 mark 操作，则为 true。
     */
    public boolean markSupported() {
        return in.markSupported();
    }

    /**
     * 标记流中的当前位置。
     *
     * @throws  IOException  如果流不支持 mark()，或发生其他 I/O 错误。
     */
    public void mark(int readAheadLimit) throws IOException {
        in.mark(readAheadLimit);
    }

    /**
     * 重置流。
     *
     * @throws  IOException  如果流未被标记，或标记已失效，
     *                      或流不支持 reset()，或发生其他 I/O 错误。
     */
    public void reset() throws IOException {
        in.reset();
    }

    /**
     * 关闭流。
     *
     * @throws  IOException  如果发生 I/O 错误。
     */
    public void close() throws IOException {
        in.close();
    }
}
